function [] = modelingMultiPoly()

degree = 7; % степень неприводимого полинома, а также количество бит,
            % передаваемых в одном кодовом слове
            
nMax = 500; % Количество испытаний

wordLength = 2^degree - 1;

% М-последовательности:
%                   X7 X6 X5 X4 X3 X2 X  1  
M1 = generate_mseq([1, 0, 0, 0, 0, 0, 1, 1]); % X7+X +1
M2 = generate_mseq([1, 0, 1, 0, 1, 0, 1, 1]); % X7+X5+X3+X +1
M3 = generate_mseq([1, 1, 1, 1, 1, 1, 0, 1]); % X7+X6+X5+X4+X3+X2+1
M4 = generate_mseq([1, 0, 1, 1, 1, 0, 0, 1]); % X7+X5+X4+X3+1
M5 = generate_mseq([1, 0, 0, 0, 1, 0, 0, 1]); % X7+X3+1
% M6 = generate_mseq([1, 1, 1, 0, 0, 1, 0, 1]); % X7+X6+X5+X2+1
% M7 = generate_mseq([1, 1, 1, 0, 1, 1, 1, 1]); % X7+X6+X5+X3+X2+X+1
% M8 = generate_mseq([1, 1, 0, 0, 1, 0, 1, 1]); % X7+X6+X3+X+1

% Последовательности Голда:
GM1 = xor(M1,M2);
GM2 = xor(M2,M3);
GM3 = xor(M3,M4);
GM4 = xor(M5,M1);
GM5 = xor(M1,M3);

MSource = [M1;GM1;M2;GM2;M3;GM3;M4;GM4;M5;GM5]*2-1;
%MSource = [M5;GM5]*2-1;
%MSource = [M1;M2;M3;M4;M5;M6;M7;M8]*2-1;
%MSource = [M1;M2;M3;M4]*2-1;
%MSource = M1*2-1;


userMax = size(MSource,1); % Максимальное количество активных пользоваетлей
graphInfo = zeros(1,userMax);

for k = 1 : userMax
    errCount = 0; % Счетчик ошибок
	
    % В цикле уменьшаем кол-во пользователей, отрезая элементы MSource
    M = MSource(k:userMax,:); 
    userCount = size(M,1);
    for n = 1 : nMax

        % Выбираем случайные сдвиги М-последовательности
        % для каждого из пользователей
        % shift_s(i) принадлежит [1,127]
        shift_S = (fix(1 + (wordLength).*rand(userCount,1)))';

        % Генерация сообщений (сдвинутых М-последовательностей)
        MSG = zeros(size(M));
        for i = 1 : userCount
            MSG(i,:) = circshift(M(i,:),[0 shift_S(i)]);
        end

        C = sum(MSG, 1); % Канал суммирует сообщения
        
        shift_R = zeros(size(shift_S));
        for j = 1 : userCount % Для каждого пользователя...
            H = zeros(1,wordLength);  
		% ...вложенный цикл, считает взаимную корелляцию 
		% содержимого канала с каждым из сдвигов
		% M-последовательности пользователя
            for i = 1 : wordLength
                H(i) = sum(C.*circshift(M(j,:),[0 i]));% Подсчет корелляции
            end
		% Выбирая максимальную корелляцию, определяем сдвиг
            [~, shift_R(j)] = max (H, [], 2); 
        end
        % Количество ошибок = расстояние Хемминга
        % между исходными сдвигами сообщений
        % и полученными сдвигами на выходе канала
        errCount = errCount + pdist([shift_S;shift_R],'hamming')*userCount;
        

    end
    % Считаем вероятность ошибки на слово
    graphInfo(k) = errCount / (nMax*userCount);
end

    graphInfo = fliplr(graphInfo);
    graphInfo
    figure(1); clf;
    semilogy(1:userMax,graphInfo,'bo-');
    axis([1, userMax, min(graphInfo), max(graphInfo)])
    %axis([min(SNRdB), max(SNRdB),1e-3, 0.5])
    xlabel('User activity')
    ylabel('Pe')
    title('Total comparison')
    grid on
% Сделать декод-ние по корелляции или по комбинациям, а не по расстоянию
% Попробовать разные активности пользователей
% *Добавить шум
% *Попробовать последовательности Голда
% Максимум пользователей на полосе, передающей 6 бит 64/6 ~10 пользователей

% Итоговое задание:
% Построить графики вероятности ошибки. 
% Сделать 10 пользователей.
% Использовать полиномы 7-й степени и ПТ-ти Голда
% Менять активность пользователей и для каждой активности - свой график

% Прогнать на одном пользователе все его сдвиги и посчитать корелляцию для
% всех 127 сдвигов. Если есть два максимума - полином битый

% Заменить 0 на -1
end


